home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
profiles.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
5KB
|
173 lines
; $Id: profiles.pro,v 1.4 1997/01/15 03:11:50 ali Exp $
;
; Copyright (c) 1988-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
pro profiles, image, sx = sx, sy = sy, wsize = wsize, order = order
;+
; NAME:
; PROFILES
;
; PURPOSE:
; Interactively draw row or column profiles of an image in a separate
; window.
;
; CATEGORY:
; Image analysis.
;
; CALLING SEQUENCE:
; PROFILES, Image [, SX = sx, SY = sy]
;
; INPUTS:
; Image: The variable that represents the image displayed in current
; window. This data need not be scaled into bytes.
; The profile graphs are made from this array.
;
; KEYWORD PARAMETERS:
; SX: Starting X position of the image in the window. If this
; keyword is omitted, 0 is assumed.
;
; SY: Starting Y position of the image in the window. If this
; keyword is omitted, 0 is assumed.
;
; WSIZE: The size of the PROFILES window as a fraction or multiple
; of 640 by 512.
;
; ORDER: Set this keyword param to 1 for images written top down or
; 0 for bottom up. Default is the current value of !ORDER.
;
; OUTPUTS:
; No explicit outputs.
;
; COMMON BLOCKS:
; None.
;
; SIDE EFFECTS:
; A new window is created and used for the profiles. When done,
; the new window is deleted.
;
; RESTRICTIONS:
; None.
;
; PROCEDURE:
; A new window is created and the mouse location in the original
; window is used to plot profiles in the new window. Pressing the
; left mouse button toggles between row and column profiles.
; The right mouse button exits.
;
; EXAMPLE:
; Create and display an image and use the PROFILES routine on it.
; Create and display the image by entering:
;
; A = BYTSCL(DIST(256))
; TV, A
;
; Run the PROFILES routine by entering:
;
; PROFILES, A
;
; The PROFILES window should appear. Move the cursor over the original
; image to see the profile at the cursor position. Press the left mouse
; button to toggle between row and column profiles. Press the right
; mouse button (with the cursor over the original image) to exit the
; routine.
;
; MODIFICATION HISTORY:
; DMS, Nov, 1988.
;-
on_error,2 ;Return to caller if an error occurs
if n_elements(sx) eq 0 then sx = 0 ;Default start of image
if n_elements(sy) eq 0 then sy = 0
if n_elements(wsize) eq 0 then wsize = .75
s = size(image)
maxv = max(image) ;Get extrema
minv = min(image)
orig_w = !d.window
nx = s[1] ;Cols in image
ny = s[2] ;Rows in image
IF (!Version.Os NE 'MacOS') THEN tvcrs,sx+nx/2,sy+ny/2,/dev ELSE tvcrs,1
tickl = 0.1 ;Cross length
print,'Left mouse button to toggle between rows and columns.'
print,'Right mouse button to Exit.'
window,/free ,xs=wsize*640, ys=wsize*512,title='Profiles' ;Make new window
new_w = !d.window
old_mode = -1 ;Mode = 0 for rows, 1 for cols
old_font = !p.font ;Use hdw font
!p.font = 0
mode = 0
if n_elements(order) eq 0 then order = !order ;Image order
while 1 do begin
wset,orig_w ;Image window
cursor,x,y,2,/dev ;Read position
if !err eq 1 then begin
mode = 1-mode ;Toggle mode
repeat cursor,x,y,0,/dev until !err eq 0
endif
x = x - sx ;Remove bias
y = y - sy
wset,new_w ;Graph window
if !err eq 4 then begin ;Quit
wset,orig_w
IF (!Version.Os NE 'MacOS') THEN $
tvcrs,nx/2,ny/2,/dev ;curs to old window
tvcrs,0 ;Invisible
wdelete, new_w
!p.font = old_font
return
endif
if mode ne old_mode then begin
old_mode = mode
first = 1
if mode then begin ;Columns?
plot,[minv,maxv],[0,ny-1],/nodat,title='Column Profile'
vecy = findgen(ny)
crossx = [-tickl, tickl]*(maxv-minv)
crossy = [-tickl, tickl]*ny
end else begin
plot,[0,nx-1],[minv,maxv],/nodata,title='Row Profile'
vecx = findgen(nx)
crossx = [-tickl, tickl]*nx
crossy = [-tickl, tickl]*(maxv-minv)
endelse
endif
if (x lt nx) and (y lt ny) and $
(x ge 0) and (y ge 0) then begin ;Draw it
if order then y = (ny-1)-y ;Invert y?
if first eq 0 then begin ;Erase?
plots, vecx, vecy, col=0 ;Erase graph
plots, old_x, old_y, col=0 ;Erase cross
plots, old_x1, old_y1, col=0
xyouts,.1,0,/norm,value,col=0 ;Erase text
empty
endif else first = 0
;;;; value = string([x,y],format="('(',i4,',',i4,')')")
;;;; value = strtrim(x,2) + string(y)
value = strmid(x,8,4)+strmid(y,8,4)
ixy = image[x,y] ;Data value
if mode then begin ;Columns?
vecx = image[x,*] ;get column
old_x = crossx + ixy
old_y = [y,y]
old_x1 = [ixy, ixy]
old_y1 = crossy + y
endif else begin
vecy = image[*,y] ;get row
old_x = [ x,x]
old_y = crossy + ixy
old_x1 = crossx + x
old_y1 = [ixy,ixy]
endelse
xyouts,.1,0,/norm,value ;Text of locn
plots,vecx,vecy ;Graph
plots,old_x, old_y ;Cross
plots,old_x1, old_y1
endif
endwhile
end